2023.08.09 NNの重み行列確認(活性化関数)【torch】
torch.nn にはインスタンス化して利用する関数、torch.nn.functionalにはインスタンス化せずに利用する関数が格納されている。それぞれのモジュールには同じ機能を持った関数が用意されている。どのように使い分けるのが良いだろうか。
例)ReLU関数:
torch.nn.ReLU
torch.nn.functional.relu
ReLUは重み行列のような属性を持たないので、インスタンス化することの必然性はあまり感じられない。Softmax関数は軸を指定する必要があるので、インスタンスに属性として保持しておくことができるのが便利である。
code:python
import torch
import torch.nn as nn
import torch.nn.functional as F
class Net1(nn.Module):
def __init__(self):
super().__init__()
self.relu = nn.ReLU()
self.softmax = nn.Softmax(dim=1)
model1 = Net1()
for param in model1.parameters():
print(param)
インスタンス化せずに利用する関数は torch.nn.functional に格納されている。使う度に呼出し、その都度オプションを指定するような使い方となる。
code:python
import torch
import torch.nn as nn
import torch.nn.functional as F
class Net1(nn.Module):
def forward(self, x):
x = F.relu(x)
x = F.softmax(x, dim=1)
return x
model1 = Net1()
for param in model1.parameters():
print(param)
実行結果より、これらは重みパラメータを保持していないことが確認できる。
インスタンス化するやりかたは以下の点に利点を感じる。
コンストラクタ内で全ての要素を用意することになるので、プログラムの可読性が向上する。
nn.Sequential に登録できるので、コードをより簡潔に記述できる。